#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
//int addToTarget(int from, int to)
//{
//    int sum = 0;
//    for(int i = from; i<to ;i++)
//    {
//        sum += i;
//    }
//    // exit(15);  // 库函数
//    _exit(31); //系统调用
//    // return sum;
//}
int main()
{
    pid_t id = fork();
    if(id == 0)
    {
        //子进程
        int cnt = 5;
        while(cnt)
        {
            printf("我是子进程：%d, 父进程：%d, cnt：%d\n",getpid(), getppid(), cnt--);
            sleep(1);
            int a = 10;
            a /= 0;
        }
        // 运行完
        //1. 代码跑完，结果对
        //2. 代码跑完，结果不对
        //异常
        //3. 代码没跑完，出异常了
        exit(10);//进程退出
    }
    // 父进程
    //sleep(15); // 这样子进程由于没有父进程回收会有5秒处于Z状态
    //pid_t ret = wait(NULL);
    int status = 0;//不是被整体使用的，有自己的位图结构
    pid_t ret = waitpid(id, &status, 0);
    if(id > 0)
    {
        printf("wait success: %d, sign number:  %d, child exit code: %d\n", ret, (status & 0x7F), (status >> 8)&(0xFF));
    }

    sleep(5);


   // printf("hello world");
   // sleep(2);
   // _exit(1);
   // int ret = addToTarget(1, 100);
   // printf("%d\n",ret);
 ////   exit(12);
 //   for(int i=0;i<200;i++)
 //   {
 //       printf("%d: %s\n", i, strerror(i));
 //   }
 ////   //写代码为了完成某件事情，我如何得知我的任务跑的如何呢？
 //   //进程退出码
 //   int num = addToTarget(1, 100);
 //   if(num == 5050)
 //   {
 //       return 0;
 //   }
 //   else 
 //   {
 //       return 1;
 //   }
 //   // 一般而言，退出码，都必须有对应的退出码的文字描述，1.可以自定义 2.可以使用系统的映射关系（不太频繁）
 //   // 退出码的意义：0:success, !0：表示失败， ！0具体是几，表示不同的错误 ——数字对人不友好，对计算机友—
 //   // 如何设定main函数的返回值呢？如果不关心进程退出码，return什么都行，一般是0
 //   // 如果未来我们要关心进程退出码的时候，要返回特定的数据表明特定的错误，一般0表示成功，非0表示错误
 //   //0:进程退出的时候，对应的退出码
 //   //标定进程执行的结果是否正确
 //   //return 0;
     return 0;
}
